package cn.jzq.mysoul.yourname.web;

import cn.jzq.mysoul.yourname.domain.Blog;
import cn.jzq.mysoul.yourname.service.IBlogService;
import cn.jzq.mysoul.yourname.util.ResultJson;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * 幂等（idempotent、idempotence）是一个数学或计算机学概念，常见于抽象代数中。
 * 　　幂等有一下几种定义：
 * 　　(1) 对于单目运算，如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的，
 * 那么我们就称该运算是幂等的。 比如绝对值运算就是一个例子，在实数集中，有abs(a)=abs(abs(a))。
 * 　　(2) 对于双目运算，则要求当参与运算的两个值是等值的情况下，如果满足运算结果与参与运算的两个值相等，则称该运算幂等，
 * 如求两个数的最大值的函数，有在在实数集中幂等，即max(x,x) = x。
 * <p>
 * put : 当你允许客户端指定新建资源的资源标识符时要使用PUT。但要记住，因为PUT是幂等的，你必须要发送所有可能的值。
 * PUT更新某一资源，则必须要更新资源的全部属性。你必须要在PUT请求中发送所有属性值以保证幂等性。
 * <p>
 * 设你使用HTTP PUT方法提交了一个update请求。在请求体中，你设置了givenName和surname的值分别为"John"和"Smith"。
 * 接着你又提交了另一个HTTP PUT的请求，这次你将givenName的值设置为"Johnny"。它是幂等的么？不。为什么呢？
 * 因为在这两次请求的间隙，其他请求可能已经改变了account资源的服务端状态。例如，在这两次请求之间，status
 * 的值可能已经变成了“blocked"。我们示范的请求在重复提交时不能保证在服务端的account资源的状态是相同的
 */
@Controller
@RequestMapping(value = "/api/blogs")
public class BlogController {

    @Resource
    private  IBlogService blogService;


    /**
     * Returns all instances of the type.
     *
     * @return all entities
     */
    // 通过@ApiOperation注解来给API增加说明、通过@ApiImplicitParams、@ApiImplicitParam注解来给参数增加说明
    @ApiOperation(value = "获取所有的blog")
    @RequestMapping(value = "/", method = RequestMethod.GET)
    @ResponseBody
    public ResultJson getBlogList() {
        ResultJson resultJson = new ResultJson();
        List<Blog> blogLlist = (List<Blog>) blogService.selectList(null);
        resultJson.setData(blogLlist);

        return resultJson;
    }

    @ApiImplicitParam(name = "id", value = "博客ID", paramType = "path", required = true, dataType = "Long")
    @ApiOperation(value = "获取blog详细信息", notes = "根据url的id来获取blog详细信息")
    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    @ResponseBody
    public ResultJson getBlog(@PathVariable("id") Long id) {
        Blog blog = blogService.selectByTitle("123");
        return ResultJson.success(blogService.selectById(id));
    }


    @ApiOperation(value = "更新blog详细信息", notes = "根据url的id来指定更新对象，并根据传过来的blog信息来更新blog详细信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "blog ID", paramType = "path", required = true, dataType = "Long"),
            @ApiImplicitParam(name = "blog", value = "Blog详细实体", required = true, dataType = "Blog")
    })
    @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
    @ResponseBody
    public ResultJson putBlog(@PathVariable Long id, @ModelAttribute Blog blog) {

        Blog targetBlog = blogService.selectById(id);

        if (targetBlog == null)
            return ResultJson.error(403, "更新失败，没有这条信息。创建请使用post请求");

        blog.setId(id);
        //blog.setModifyInfo();
        blogService.updateById(blog);

        return ResultJson.success();
    }


    @ApiOperation(value = "创建Blog", notes = "根据Blog对象创建blog")
    @ApiImplicitParam(name = "blog", value = "Blog详细实体", required = true, dataType = "Blog")
    @RequestMapping(value = "", method = RequestMethod.POST)
    @ResponseBody
    public ResultJson postBlog(@ModelAttribute Blog blog) {

        //     blog.setCreateInfo();

        //blog.setCreateInfo();
        blogService.insert(blog);
        //blogService.selectList(new EntityWrapper<Blog>().eq("title", "123"));
        return ResultJson.success();
    }

    @ApiOperation(value = "删除blog", notes = "根据id删除blog")
    @ApiImplicitParam(value = "id", dataType = "Long")
    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
    @ResponseBody
    public ResultJson deleteBlog(@PathVariable("id") Long id) {
        if (id != null)
            blogService.deleteById(id);

        return ResultJson.success();
    }

    @ApiOperation(value = "批量删除blog")
    @ApiImplicitParam(name = "ids", value = "ids", paramType = "path", dataType = "List")
    @RequestMapping(value = "/batch/{ids}", method = RequestMethod.DELETE)
    @ResponseBody
    public ResultJson deleteBlogs(@PathVariable("ids") List<Long> ids) {

        blogService.deleteBatchIds(ids);
        return ResultJson.success();
    }


}
